// 云对象教程: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
// 分类管理云对象
const uniID = require('uni-id-common')
const db = uniCloud.database()
const dbCmd = db.command

module.exports = {
	_before: async function () {
		// 通用预处理器 - 登录校验
		this.uniID = uniID.createInstance({ context: this })
		const auth = await this.uniID.checkToken(this.getUniIdToken())
		
		if (auth.code === 0) {
			this.uid = auth.uid
		} else {
			throw new Error('未登录或登录已过期')
		}
	},
	
	/**
	 * 获取所有分类（公共分类 + 用户自定义分类）
	 * @param {string} type 类型筛选（支出/收入）
	 * @returns {object} 分类列表
	 */
	async listCategories({ type } = {}) {
		const query = db.collection('categories')
		
		// 构建查询条件：公共分类（user_id为空）或者当前用户的自定义分类
		let whereCondition = dbCmd.or([
			{ user_id: dbCmd.exists(false) },
			{ user_id: null },
			{ user_id: '' },
			{ user_id: this.uid }
		])
		
		// 如果指定了类型，添加类型筛选
		if (type) {
			whereCondition = dbCmd.and([
				whereCondition,
				{ type }
			])
		}
		
		const res = await query
			.where(whereCondition)
			.orderBy('create_time', 'asc')
			.get()
		
		return { code: 0, data: res.data }
	},
	
	/**
	 * 添加自定义分类
	 * @param {object} data 分类数据 {name, type, icon}
	 * @returns {object} 返回结果
	 */
	async addCategory(data) {
		if (!data.name || !data.type) {
			return { code: 1, msg: '缺少必要字段' }
		}
		
		const category = {
			name: data.name,
			type: data.type,
			icon: data.icon || '',
			user_id: this.uid,
			create_time: Date.now()
		}
		
		const res = await db.collection('categories').add(category)
		return { code: 0, msg: '添加成功', id: res.id }
	},
	
	/**
	 * 更新自定义分类
	 * @param {string} id 分类ID
	 * @param {object} data 更新的数据
	 * @returns {object} 返回结果
	 */
	async updateCategory(id, data) {
		// 检查权限：只能修改自己的分类
		const checkRes = await db.collection('categories')
			.doc(id)
			.get()
		
		if (checkRes.data.length === 0 || checkRes.data[0].user_id !== this.uid) {
			return { code: 1, msg: '无权限操作' }
		}
		
		// 只允许更新这些字段
		const updateData = {}
		if (data.name !== undefined) updateData.name = data.name
		if (data.type !== undefined) updateData.type = data.type
		if (data.icon !== undefined) updateData.icon = data.icon
		
		await db.collection('categories')
			.doc(id)
			.update(updateData)
		
		return { code: 0, msg: '更新成功' }
	},
	
	/**
	 * 删除自定义分类
	 * @param {string} id 分类ID
	 * @returns {object} 返回结果
	 */
	async deleteCategory(id) {
		// 检查权限
		const checkRes = await db.collection('categories')
			.doc(id)
			.get()
		
		if (checkRes.data.length === 0 || checkRes.data[0].user_id !== this.uid) {
			return { code: 1, msg: '无权限操作' }
		}
		
		// 检查是否有记录使用了这个分类
		const recordRes = await db.collection('records')
			.where({ category_id: id })
			.count()
		
		if (recordRes.total > 0) {
			return { code: 1, msg: '该分类下有记账记录，无法删除' }
		}
		
		await db.collection('categories')
			.doc(id)
			.remove()
		
		return { code: 0, msg: '删除成功' }
	},
	
	/**
	 * 初始化默认分类（公共分类）
	 * @returns {object} 返回结果
	 */
	async initDefaultCategories() {
		const defaultCategories = [
			// 支出类别
			{ name: '餐饮', type: '支出', icon: 'icon-canyin' },
			{ name: '交通', type: '支出', icon: 'icon-jiaotong' },
			{ name: '购物', type: '支出', icon: 'icon-gouwu' },
			{ name: '娱乐', type: '支出', icon: 'icon-yule' },
			{ name: '医疗', type: '支出', icon: 'icon-yiliao' },
			{ name: '居住', type: '支出', icon: 'icon-juzhu' },
			{ name: '通讯', type: '支出', icon: 'icon-tongxun' },
			{ name: '学习', type: '支出', icon: 'icon-xuexi' },
			{ name: '其他', type: '支出', icon: 'icon-qita' },
			// 收入类别
			{ name: '工资', type: '收入', icon: 'icon-gongzi' },
			{ name: '奖金', type: '收入', icon: 'icon-jiangjin' },
			{ name: '理财', type: '收入', icon: 'icon-licai' },
			{ name: '兼职', type: '收入', icon: 'icon-jianzhi' },
			{ name: '其他', type: '收入', icon: 'icon-qita' }
		]
		
		// 检查是否已初始化
		const count = await db.collection('categories')
			.where({
				user_id: dbCmd.or([
					dbCmd.exists(false),
					null,
					''
				])
			})
			.count()
		
		if (count.total > 0) {
			return { code: 1, msg: '默认分类已存在' }
		}
		
		// 批量添加
		const addPromises = defaultCategories.map(item => {
			return db.collection('categories').add({
				...item,
				create_time: Date.now()
			})
		})
		
		await Promise.all(addPromises)
		
		return { code: 0, msg: '初始化成功' }
	}
}
